/**
 * 获取字符串中，某个字符的所有下标
 * @param {String} letter 搜索字符
 * @param {String} str 字符串
 */
function findAllIndex(letter, str) {
    let ret = [];
    let arrStr = str.split('');
    let letterIndex = arrStr.indexOf(letter, 0);
    while (letterIndex >= 0) {
        ret.push(letterIndex);
        letterIndex = arrStr.indexOf(letter, letterIndex + 1);
    }

    return ret;
}

/**
 * 2进制补全
 * @param {string} str
 * @param {number} len
 */
function fillZeroBinary(str, len = 8) {
    while (str.length < len) {
        str = '0' + str;
    }

    return str;
}

/**
 * 生成一个初始值为自身的数组
 * @param {number} len
 */
function newArrayDefault(len) {
    return new Array(len).fill(-1).map((_, idx) => idx);
}

/**
 * 生成2维（row * col）矩阵，内由100以内随机数字填充
 * @param {*} row
 * @param {*} col
 * @param {*} defaultValue 默认值，-1代表所有值都随机
 * @returns
 */
function new2DMatrix(row, col, defaultValue = -1) {
    const ret = [];
    for (let r = 0; r < row; r++) {
        let arr_row = [];
        for (let y = 0; y < col; y++) {
            if (defaultValue === -1) {
                arr_row.push(Math.round(Math.random() * 100));
            } else {
                arr_row.push(defaultValue);
            }
        }
        ret.push(arr_row);
    }
    return ret;
}

function newID() {
    // 获取当前时间戳
    let timestamp = Date.now().toString(36);

    // 生成一个随机数
    let randomNumber = Math.random().toString(36).slice(2, 5);

    // 可选：添加其他信息，例如当前页面的URL或用户信息等
    // let additionalInfo = window.location.href; // 仅作为示例，实际中可能需要哈希或其他处理

    // 组合时间戳和随机数（以及其他信息，如果有的话）
    // 如果添加了additionalInfo，确保对其进行适当的处理以减少长度和避免特殊字符
    let id = timestamp + randomNumber;

    // 可选：将ID转换为其他格式，例如Base64

    return id;
}

/**
 * odd奇数 even偶数
 * @param {number} x
 * @returns
 */
function isOdd(x) {
    return x & 1 ? true : false;
}

function log(str) {
    console.log(str);
}

function IP2String(strIP) {
    let arr = strIP.split('.');

    let acc = '';
    acc = arr.reduce(
        (acc, cur) => (acc += fillZeroBinary(parseInt(cur).toString(2))),
        acc
    );
    log(`${strIP} => ${acc}`);
    return parseInt(acc, 2);
}

/** 校验整数，正整数和负整数都为true，其他为false */
function isNumber(str) {
    str = '' + str;
    let regex = /^[\-\+]?[\d]+$/g;
    return regex.test(str);
}

function isPositiveNumber(str) {
    str = '' + str;
    let regex = /^\+?[\d]+$/g;
    return regex.test(str);
}

function isNumberArray(str) {
    // '1 2 3 4' => return true
    // '-1 2 3 4' => return false
    // 'a b¬ 3 4' => return false

    str = '' + str;
    let regex = /^(\d+|[\d\s]+\d+)$/g;
    return regex.test(str);
}

/**
 * 最长的数学表达式
 * 正负号，+-*\/
 * @param {string} str
 */
function getLongestExpressionResult(str) {
    const regex = /([+\-]?\d+[+\-*\/])*[+\-]?\d+/g;

    // console.log(`数学表达式： ${str}`);
    let arr = [...str.matchAll(regex)][0];

    // 如果没找到数学表达式，那返回null
    if (arr == undefined) {
        console.log(`${str} result is null`);
        return;
    }

    console.log(arr);
    let selLength = 0;
    let selElement = null;
    arr.forEach((ele) => {
        if (ele != undefined && typeof ele === 'string') {
            if (ele.length > selLength) {
                selElement = ele;
                selLength = ele.length;
            }
        }
    });

    if (selElement != null) {
        selElement = eval(selElement);
    }

    console.log(`${str} result is: ${selElement}`);
}

module.exports = {
    findAllIndex,
    fillZeroBinary,
    newArrayDefault,
    log,
    new2DMatrix,
    newID,
    isOdd,
    IP2String,
    isNumber,
    isPositiveNumber,
};
